package com.kai.xadmin.utils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

/**
 * 自动生成数据库表的实体类、服务类、mapper类以及xml文件
 * 
 * mybatis plus 代码生成器建议版本：3.5.3.1 ；需要freemarker
 * 
 * @author trouble
 *
 */
public class CodeGenerator {

	public static void main(String[] args) {
		FastAutoGenerator.create(
				"jdbc:mysql://localhost:3306/laydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
				"root", "1234")
				// 全局配置
				.globalConfig((scanner, builder) -> builder.author("trouble")
						// 设置输出目录
						.outputDir(System.getProperty("user.dir") + "\\src\\main\\java")
						// 开启swagger
						.enableSwagger())
				// 包配置
				.packageConfig((scanner, builder) -> builder.parent("com.kai.xadmin")
						// mapper.xml文件输出路径
						.pathInfo(Collections.singletonMap(OutputFile.xml,
								System.getProperty("user.dir") + "\\src\\main\\resources\\mapper")))
				// 策略配置
				.strategyConfig(
						(scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
								.controllerBuilder().enableRestStyle().enableFileOverride().enableHyphenStyle()
								.serviceBuilder().formatServiceFileName("%sService").enableFileOverride()
								.mapperBuilder().enableFileOverride().entityBuilder().enableFileOverride()
								.enableLombok().addTableFills(new Column("create_time", FieldFill.INSERT)).build())
				/*
				 * 模板引擎配置，默认 Velocity 可选模板引擎 Beetl 或 Freemarker .templateEngine(new
				 * BeetlTemplateEngine()) .templateEngine(new FreemarkerTemplateEngine())
				 */
				.templateEngine(new FreemarkerTemplateEngine()).execute();

	}

	// 处理 all 情况
	protected static List<String> getTables(String tables) {
		return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
	}
}
